package JavaCode.top_interview_questions_medium.design;

import java.util.*;

public class one {
    /**
     * Definition for a binary tree node.
     *
     */
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

    public class Codec {

        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {

            if(root==null) return null;
            StringBuilder sb=new StringBuilder();
            Queue<TreeNode> queue=new LinkedList<>();
            queue.add(root);
            while (!queue.isEmpty())
            {
                TreeNode node=queue.poll();
                if(node==null)
                {
                    sb.append("#,");
                }
                else
                {
                    sb.append(node.val+",");
                    queue.add(node.left);
                    queue.add(node.right);
                }
            }
            sb.deleteCharAt(sb.length()-1);
            return sb.toString();
        }

        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            if(data==null||data.length()==0) return null;
            String[] datas=data.split(",");
            Queue<TreeNode> queue=new ArrayDeque<>();
            TreeNode root=new TreeNode(Integer.parseInt(datas[0]));
            queue.add(root);

            for(int i=1;i<datas.length;)
            {
                TreeNode node=queue.poll();
                if(!datas[i].equals("#"))
                {
                    node.left=new TreeNode(Integer.parseInt(datas[i]));
                    queue.add(node.left);
                }
                i++;
                if(!datas[i].equals("#"))
                {
                    node.right=new TreeNode(Integer.parseInt(datas[i]));
                    queue.add(node.right);
                }
                i++;
            }
            return root;

        }
    }

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
}
/**
 * https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/52/design/109/
 * 二叉树的序列化与反序列化
 * 序列化是将一个数据结构或者对象转换为连续的比特位的操作，进而可以将转换后的数据存储在一个文件或者内存中，同时也可以通过网络传输到另一个计算机环境，采取相反方式重构得到原数据。
 *
 * 请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑，你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
 *
 * 示例:
 *
 * 你可以将以下二叉树：
 *
 *     1
 *    / \
 *   2   3
 *      / \
 *     4   5
 *
 * 序列化为 "[1,2,3,null,null,4,5]"
 * 提示: 这与 LeetCode 目前使用的方式一致，详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式，你也可以采用其他的方法解决这个问题。
 *
 * 说明: 不要使用类的成员 / 全局 / 静态变量来存储状态，你的序列化和反序列化算法应该是无状态的。
 */
